/*
 * @Author: SeonHu
 * @Date: 2025-09-16 14:44:19
 * @LastEditors: SeonHu
 * @LastEditTime: 2025-09-23 15:07:36
 * @FilePath: \bg-vben\src\api\iot\admin\device\index.ts
 * @Description:
 * Copyright © 2020-2025 SANQING Corporation, All rights reserved.
 */
import type { DeviceVariableInfo } from '../../model';
import type {
  DeviceConfigInputDto,
  DeviceConfigOutputDto,
  DeviceGroupInputDto,
  DeviceGroupNode,
  DeviceGroupOutputDto,
  DeviceGroupTreeNode,
  DeviceInputDto,
  DeviceInputDtoSimple,
  DeviceNode,
  DeviceOutputDto,
  DeviceOutputDtoSimple,
  DeviceTreeNode,
  DeviceVariableInputDto,
  DeviceVariableOutputDto,
  DriverMethodDto,
} from './model';

import type { ErrorMessageMode, PageData } from '#/request';

import { request } from '@/utils/request/axios';

import { PageRequest } from '#/request';

/** IoT设备枚举 */
enum Api {
  // 设备组
  /** 读取设备组 */
  ReadGroup = '/api/iot/admin/device/readGroup',
  /** 读取设备组节点 */
  ReadGroupNode = '/api/iot/admin/device/readGroupNode',
  /** 读取设备组树 */
  ReadGroupTreeNode = '/api/iot/admin/device/readGroupTreeNode',

  /** 获取组节点 */
  GetGroupNode = '/api/iot/admin/device/getGroupNode',
  /** 获取排除指定编号后的设备组树 */
  GetGroupTreeNodeExclude = '/api/iot/admin/device/getGroupTreeNodeExclude',

  /** 新增设备组 */
  CreateGroup = '/api/iot/admin/device/createGroup',
  /** 更新设备组 */
  UpdateGroup = '/api/iot/admin/device/updateGroup',
  /** 删除设备组 */
  DeleteGroup = '/api/iot/admin/device/deleteGroup',

  // 设备
  /** 读取设备 */
  Read = '/api/iot/admin/device/read',
  /** 读取设备简单信息 */
  ReadSimple = '/api/iot/admin/device/readSimple',
  /** 读取指定组号的设备节点 */
  ReadNode = '/api/iot/admin/device/readNode',

  /** 读取设备节点 */
  ReadNodes = '/api/iot/admin/device/readNodes',
  /** 读取设备树 */
  ReadTreeNodes = '/api/iot/admin/device/readTreeNodes',

  /** 新增设备 */
  Create = '/api/iot/admin/device/create',
  /** 更新设备 */
  Update = '/api/iot/admin/device/update',
  /** 删除设备 */
  Delete = '/api/iot/admin/device/delete',

  /** 更新设备简单信息 */
  UpdateSimple = '/api/iot/admin/device/updateSimple',

  // 设备配置
  /** 提取驱动配置 */
  ExtractDriverConfigs = '/api/iot/admin/device/extractDriverConfigs',

  /** 读取设备配置 */
  ReadConfig = '/api/iot/admin/device/readConfig',

  /** 新增设备配置 */
  CreateConfig = '/api/iot/admin/device/createConfig',
  /** 更新设备配置 */
  UpdateConfig = '/api/iot/admin/device/updateConfig',
  /** 删除设备配置 */
  DeleteConfig = '/api/iot/admin/device/deleteConfig',

  // 设备变量
  /** 读取设备变量 */
  ReadVariable = '/api/iot/admin/device/readVariable',

  /** 新增设备变量 */
  CreateVariable = '/api/iot/admin/device/createVariable',
  /** 更新设备变量 */
  UpdateVariable = '/api/iot/admin/device/updateVariable',
  /** 删除设备变量 */
  DeleteVariable = '/api/iot/admin/device/deleteVariable',

  /** 写入设备变量 */
  WriteVariable = '/api/iot/admin/device/writeVariable',

  /** 获取设备变量读取方法 */
  GetVariableReadMethod = '/api/iot/admin/device/getVariableReadMethod',
  /** 获取设备变量写入方法 */
  GetVariableWriteMethod = '/api/iot/admin/device/getVariableWriteMethod',
  /** 获取设备变量方法 */
  GetVariableMethod = '/api/iot/admin/device/getVariableMethod',
}

// 设备组
// #region 读取设备组
/**
 * 读取设备组
 * @param params 分页请求
 * @param mode 错误消息模型
 */
export function readDeviceGroup(params: PageRequest, mode: ErrorMessageMode = 'message') {
  return request.post<PageData<DeviceGroupOutputDto>>(
    {
      url: Api.ReadGroup,
      params,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 读取设备组节点
/**
 * 读取设备组节点
 * @param params 分页请求
 * @param mode 错误消息模型
 */
export function readDeviceGroupNode(params: PageRequest, mode: ErrorMessageMode = 'message') {
  return request.post<PageData<DeviceGroupNode>>(
    {
      url: Api.ReadGroupNode,
      params,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 读取设备组树
/**
 * 读取设备组树
 * @param params 分页请求
 * @param mode 错误消息模型
 */
export function readDeviceGroupTreeNode(params: PageRequest, mode: ErrorMessageMode = 'message') {
  return request.post<PageData<DeviceGroupTreeNode>>(
    {
      url: Api.ReadGroupTreeNode,
      params,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion

// #region 获取设备组节点
/**
 * 获取设备组节点
 * @param groupId 设备组编号
 * @param mode 错误消息模型
 */
export function getDeviceGroupNode(groupId: bigint | string, mode: ErrorMessageMode = 'message') {
  return request.get<DeviceGroupNode>(
    {
      url: Api.GetGroupNode,
      params: { groupId },
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 获取排除指定编号后的设备组树
/**
 * 获取排除指定编号后的设备组树
 * @param groupId 设备组编号
 * @param mode 错误消息模型
 */
export function getDeviceGroupTreeNodeExclude(groupId?: bigint | string, mode: ErrorMessageMode = 'message') {
  return request.get<DeviceGroupTreeNode[]>(
    {
      url: Api.GetGroupTreeNodeExclude,
      params: { groupId },
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion

// #region 新增设备组
/**
 * 新增设备组
 * @param dtos 设备组DTO
 * @param mode 错误消息模型
 */
export function createDeviceGroup(dtos: DeviceGroupInputDto[], mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.CreateGroup,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 更新设备组
/**
 * 更新设备组
 * @param dtos 设备组DTO
 * @param mode 错误消息模型
 */
export function updateDeviceGroup(dtos: DeviceGroupInputDto[], mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.UpdateGroup,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 删除设备组
/**
 * 删除设备组
 * @param ids 设备组编号
 * @param mode 错误消息模型
 */
export function deleteDeviceGroup(ids: (bigint | string)[], mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.DeleteGroup,
      params: ids,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion

// 设备
// #region 读取设备
/**
 * 读取设备
 * @param params 分页请求
 * @param mode 错误消息模型
 */
export function readDevice(params: PageRequest, mode: ErrorMessageMode = 'message') {
  return request.post<PageData<DeviceOutputDto>>(
    {
      url: Api.Read,
      params,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 读取设备简单信息
/**
 * 读取设备简单信息
 * @param params 分页请求
 * @param mode 错误消息模型
 */
export function readDeviceSimple(params: PageRequest, mode: ErrorMessageMode = 'message') {
  return request.post<PageData<DeviceOutputDtoSimple>>(
    {
      url: Api.ReadSimple,
      params,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 读取指定组号的设备节点
/**
 * 读取指定组号的设备节点
 * @param groupIds 设备组编号
 * @param mode 错误消息模型
 */
export function readDeviceNode(groupIds: (bigint | string)[], mode: ErrorMessageMode = 'message') {
  return request.post<DeviceNode[]>(
    {
      url: Api.ReadNode,
      params: groupIds,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 读取设备节点
/**
 * 读取设备节点
 * @param mode 错误消息模型
 */
export function readDeviceNodes(mode: ErrorMessageMode = 'message') {
  return request.get<DeviceNode[]>(
    {
      url: Api.ReadNodes,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 读取设备树
/**
 * 读取设备树
 * @param mode 错误消息模型
 */
export function readDeviceTreeNodes(mode: ErrorMessageMode = 'message') {
  return request.get<DeviceTreeNode[]>(
    {
      url: Api.ReadTreeNodes,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion

// #region 新增设备
/**
 * 新增设备
 * @param dtos 设备DTO
 * @param mode 错误消息模型
 */
export function createDevice(dtos: DeviceInputDto[], mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.Create,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 更新设备
/**
 * 更新设备
 * @param dtos 设备DTO
 * @param mode 错误消息模型
 */
export function updateDevice(dtos: DeviceInputDto[], mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.Update,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 删除设备
/**
 * 删除设备
 * @param ids 设备编号
 * @param mode 错误消息模型
 */
export function deleteDevice(ids: (bigint | string)[], mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.Delete,
      params: ids,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion

// #region 更新设备简单信息
/**
 * 更新设备简单信息
 * @param dtos 设备DTO
 * @param mode 错误消息模型
 */
export function updateDeviceSimple(dtos: DeviceInputDtoSimple[], mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.UpdateSimple,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion

// 设备配置
// #region 提取驱动配置
/**
 * 提取驱动配置
 * @param ids 设备编号
 * @param mode 错误消息模型
 */
export function extractDeviceDriverConfigs(ids: (bigint | string)[], mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.ExtractDriverConfigs,
      params: ids,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion

// #region 读取设备配置
/**
 * 读取设备配置
 * @param params 分页请求
 * @param mode 错误消息模型
 */
export function readDeviceConfig(params: PageRequest, mode: ErrorMessageMode = 'message') {
  return request.post<PageData<DeviceConfigOutputDto>>(
    {
      url: Api.ReadConfig,
      params,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion

// #region 新增设备配置
/**
 * 新增设备配置
 * @param dtos 设备配置DTO
 * @param mode 错误消息模型
 */
export function createDeviceConfig(dtos: DeviceConfigInputDto[], mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.CreateConfig,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 更新设备配置
/**
 * 更新设备配置
 * @param dtos 设备配置DTO
 * @param mode 错误消息模型
 */
export function updateDeviceConfig(dtos: DeviceConfigInputDto[], mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.UpdateConfig,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 删除设备配置
/**
 * 删除设备配置
 * @param ids 设备配置编号
 * @param mode 错误消息模型
 */
export function deleteDeviceConfig(ids: (bigint | string)[], mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.DeleteConfig,
      params: ids,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion

// 设备变量
// #region 读取设备变量
/**
 * 读取设备变量
 * @param params 分页请求
 * @param mode 错误消息模型
 */
export function readDeviceVariable(params: PageRequest, mode: ErrorMessageMode = 'message') {
  return request.post<PageData<DeviceVariableOutputDto>>(
    {
      url: Api.ReadVariable,
      params,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion

// #region 新增设备变量
/**
 * 新增设备变量
 * @param dtos 设备变量DTO
 * @param mode 错误消息模型
 */
export function createDeviceVariable(dtos: DeviceVariableInputDto[], mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.CreateVariable,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 更新设备变量
/**
 * 更新设备变量
 * @param dtos 设备变量DTO
 * @param mode 错误消息模型
 */
export function updateDeviceVariable(dtos: DeviceVariableInputDto[], mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.UpdateVariable,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 删除设备变量
/**
 * 删除设备变量
 * @param ids 设备变量编号
 * @param mode 错误消息模型
 */
export function deleteDeviceVariable(ids: (bigint | string)[], mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.DeleteVariable,
      params: ids,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion

// #region 写入设备变量
/**
 * 写入设备变量
 * @param dtos 设备变量信息
 * @param mode 错误消息模型
 */
export function writeDeviceVariable(dtos: DeviceVariableInfo[], mode: ErrorMessageMode = 'message') {
  return request.post(
    {
      url: Api.WriteVariable,
      params: dtos,
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion

// #region 获取设备变量读取方法
/**
 * 获取设备变量读取方法
 * @param deviceId 设备编号
 * @param mode 错误消息模型
 */
export function getDeviceVariableReadMethod(deviceId: bigint | string, mode: ErrorMessageMode = 'message') {
  return request.get<DriverMethodDto[]>(
    {
      url: Api.GetVariableReadMethod,
      params: { deviceId },
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 获取设备变量写入方法
/**
 * 获取设备变量写入方法
 * @param deviceId 设备编号
 * @param mode 错误消息模型
 */
export function getDeviceVariableWriteMethod(deviceId: bigint | string, mode: ErrorMessageMode = 'message') {
  return request.get<DriverMethodDto[]>(
    {
      url: Api.GetVariableWriteMethod,
      params: { deviceId },
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
// #region 获取设备变量方法
/**
 * 获取设备变量方法
 * @param deviceId 设备编号
 * @param mode 错误消息模型
 */
export function getDeviceVariableMethod(deviceId: bigint | string, mode: ErrorMessageMode = 'message') {
  return request.get<DriverMethodDto[]>(
    {
      url: Api.GetVariableMethod,
      params: { deviceId },
    },
    {
      errorMessageMode: mode,
    },
  );
}
// #endregion
